package cn.bearspark.article.provider.service;

import cn.bearspark.article.dto.article.ArticleSimpleDTO;
import cn.bearspark.article.dto.article.ModifyArticleDTO;
import cn.bearspark.article.dto.article.PublishArticleDTO;
import cn.bearspark.article.provider.service.bo.Article4ModifyBO;
import cn.bearspark.article.provider.service.bo.ArticleCategoryBO;
import cn.bearspark.article.provider.service.bo.ArticleDeleteBO;
import cn.bearspark.article.provider.service.bo.ArticleDetailBO;

import java.util.List;

/**
 * 专栏的服务接口
 *
 * @author f
 */
public interface ArticleService {

    /**
     * 保存发布专栏的信息
     *
     * @param publishArticleDTO 发布专栏的数据传输对象
     */
    void publish(PublishArticleDTO publishArticleDTO);

    /**
     * 获取专栏信息，为了修改这个专栏
     * <p>
     * 如果该专栏不是该用户发布的，或没有该专栏，则返回 null
     *
     * @param articleId 待获取信息的专栏 id
     * @param userId    获取专栏信息的用户 id
     * @return 专栏信息
     */
    Article4ModifyBO get(long articleId, long userId);

    /**
     * 获取专栏信息中与分类相关的信息
     * <p>
     * 如果该专栏不是该用户发布的，或没有该专栏，则返回 null
     *
     * @param articleId 待获取分类信息的专栏 id
     * @param userId    获取专栏信息的用户 id
     * @return 专栏信息
     */
    ArticleCategoryBO getCategoryInfo(long articleId, long userId);

    /**
     * 修改专栏
     *
     * @param modifyArticleDTO  修改专栏的数据传输对象
     * @param oldCategoryIdList 旧的专栏分类 id 集合
     */
    void modify(ModifyArticleDTO modifyArticleDTO, List<Long> oldCategoryIdList);

    /**
     * 删除专栏
     * <p>
     * 如果该专栏不是该用户发布的，或没有该专栏，则无操作
     * <p>
     * 不能删除 不可见 的专栏
     *
     * @param articleId 待删除的专栏 id
     * @param userId    删除专栏的用户 id
     * @return 删除专栏的信息
     */
    ArticleDeleteBO delete(long articleId, long userId);

    /**
     * 获取专栏详情的业务数据
     * <p>
     * 如果该用户没有该专栏的访问权限，或没有该专栏，则返回 null
     *
     * @param articleId 待获取详情的专栏 id
     * @param userId    获取专栏详情的用户 id
     * @return 专栏详情的业务数据
     */
    ArticleDetailBO detail(long articleId, long userId);

    /**
     * 分页查询指定分类的专栏
     * <p>
     * 用户只能查询到足够权限的专栏
     *
     * @param pageNum      页数
     * @param pageSize     元素数
     * @param categoryId   指定的分类 id，如果为 null，表示查询所有专栏
     * @param userId       查询指定分类专栏的用户 id
     * @param listedUserId 待分页查询专栏的用户 id
     * @return 如果分类 id 为 null，则返回用户全部专栏的分页查询集合；如果分类 id 不为 null，则返回用户指定分类下的专栏的分页查询集合
     */
    List<ArticleSimpleDTO> page(int pageNum, int pageSize, Long categoryId, long userId, long listedUserId);

    /**
     * 增加指定专栏的收藏数
     *
     * @param articleId 指定的专栏 id
     */
    void incrCollectNum(long articleId);

    /**
     * 减少指定专栏的收藏数
     *
     * @param articleId 指定的专栏 id
     */
    void decrCollectNum(long articleId);

    /**
     * 增加指定专栏的功德数
     *
     * @param articleId 指定的专栏 id
     */
    void incrMeritNum(long articleId);

    /**
     * 定时发布专栏的回调接口
     *
     * @param infoList 额外信息的集合
     */
    void onArticleDeadline(List<String> infoList);
}
